package com.borya.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * 功能描述：
 * 
 * @author Administrator
 * @Date Jul 19, 2008
 * @Time 9:47:53 AM
 * @version 1.0
 */
public class DateUtils {

	public static Calendar calendar = null;

	/**
	 * 功能描述：格式化日期
	 * 
	 * @param dateStr
	 *            String 字符型日期
	 * @param format
	 *            String 格式
	 * @return Date 日期
	 */
	public static long parseDate(String dateStr, String format) {
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(format);
			String dt = dateStr;
			if ((!dt.equals("")) && (dt.length() < format.length())) {
				dt += format.substring(dt.length()).replaceAll("[YyMmDdHhSs]", "0");
			}
			return dateFormat.parse(dt).getTime();
		} catch (Exception e) {
		}
		return 0l;
	}

	/**
	 * 功能描述：格式化日期
	 * 
	 * @param dateStr
	 *            String 字符型日期：YYYY-MM-DD 格式
	 * @return Date
	 */
	public static long parseDate(String dateStr) {
		return parseDate(dateStr, "yyyy/MM/dd");
	}

	public static String format(String format) {
		return format(System.currentTimeMillis(),format);
	}
	/**
	 * 功能描述：格式化输出日期
	 * 
	 * @param time
	 * @param format
	 * @return
	 */
	public static String format(long time, String format) {
		Date date = new Date(time);
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}

	/**
	 * 
	 * @param time
	 * @return
	 */
	public static String format(long time) {
		return format(time, "yyyy/MM/dd");
	}

	/**
	 * 功能描述：返回年份
	 * 
	 * @param time
	 * @return
	 */
	public static String getYear(long time) {
		return format(time, "YYYY");
	}

	/**
	 * 功能描述：返回月份
	 * 
	 * @param time
	 * @return
	 */
	public static String getMonth(long time) {
		return format(time, "MM");
	}

	/**
	 * 功能描述：返回日
	 * 
	 * @param time
	 * @return
	 */
	public static String getDay(long time) {
		return format(time, "dd");
	}

	/**
	 * 功能描述：返回小时
	 * 
	 * @param time
	 * @return
	 */
	public static String getHour(long time) {
		return format(time, "HH");
	}

	/**
	 * 功能描述：返回分钟
	 * 
	 * @param time
	 * @return
	 */
	public static String getMinute(long time) {
		return format(time, "mm");
	}

	/**
	 * 功能描述：返回秒钟
	 * 
	 * @param time
	 * @return
	 */
	public static String getSecond(long time) {
		return format(time, "ss");
	}

	/**
	 * 功能描述：返回毫秒
	 * 
	 * @param time
	 * @return
	 */
	public static String getMillis(long time) {
		return format(time, "sss");
	}

	/**
	 * 功能描述：返回字符型日期
	 * 
	 * @param time
	 * @return
	 */
	public static String getDate(long time) {
		return format(time, "yyyy/MM/dd");
	}

	/**
	 * 功能描述：返回字符型时间
	 * 
	 * @param time
	 * @return
	 */
	public static String getTime(long time) {
		return format(time, "HH:mm:ss");
	}

	/**
	 * 功能描述：返回字符型日期时间
	 * 
	 * @param time
	 * @return
	 */
	public static String getDateTime(long time) {
		return format(time, "yyyy/MM/dd HH:mm:ss");
	}
	
	
	/**
	 * 功能描述：日期相加
	 * 
	 * @param time
	 * @param day
	 * @return
	 */
	public static long addDate(long time, int day) {
		calendar = Calendar.getInstance();
		long millis = time + ((long) day) * 24 * 3600 * 1000;
		calendar.setTimeInMillis(millis);
		return calendar.getTimeInMillis();
	}

	/**
	 * 功能描述：取得指定日期的零点
	 * 
	 * @param time
	 *            String 字符型日期
	 * @return String yyyy-MM-dd 格式
	 */
	public static long getDayBegin(long time) {
		return parseDate(format(time, "yyyy-MM-dd "), "yyyy-MM-dd ");
	}

	/**
	 * 功能描述：取得指定日期的23:59:59:999
	 * 
	 * @param time
	 *            String 字符型日期
	 * @return String yyyy-MM-dd 格式
	 */
	public static long getDayEnd(long time) {
		return parseDate(format(time, "yyyy-MM-dd ") + "23:59:59:999", "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 功能描述：取得指定月份的第一天
	 * 
	 * @param time
	 *            String 字符型日期
	 * @return String yyyy-MM-dd 格式
	 */
	public static long getMonthBegin(long time) {
		return parseDate(format(time, "yyyy-MM") + "-01", "yyyy-MM-dd HH:mm:ss:SSS");
	}

	/**
	 * 功能描述：取得指定月份的最后一天
	 * 
	 * @param time
	 *            String 字符型日期
	 * @return String 日期字符串 yyyy-MM-dd格式
	 */
	public static long getMonthEnd(long time) {
		Date date = new Date(getMonthBegin(time));
		calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return calendar.getTimeInMillis();
	}

	/**
	 * 功能描述：常用的格式化日期
	 * 
	 * @param time
	 *            Date 日期
	 * @return String 日期字符串 yyyy-MM-dd格式
	 */
	public static String formatDate(long time) {
		return formatDateByFormat(time, "yyyy-MM-dd");
	}

	/**
	 * 功能描述：以指定的格式来格式化日期
	 * 
	 * @param time
	 *            Date 日期
	 * @param format
	 *            String 格式
	 * @return String 日期字符串
	 */
	public static String formatDateByFormat(long time, String format) {
		String result = "";
		Date date = new Date(time);
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			result = sdf.format(date);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return result;
	}

	public static void main(String[] args) {
		long time = System.currentTimeMillis();

		// System.out.println(format(time, "YYYY-MM-dd HH:mm:ss:sss"));
		// System.out.println(format(time));
		// System.out.println(getYear(time));
		// System.out.println(getMonth(time));
		// System.out.println(getDay(time));
		// System.out.println(getHour(time));
		// System.out.println(getMinute(time));
		// System.out.println(getSecond(time));
		// System.out.println(Integer.valueOf(getMillis(time)));
		//
		// System.out.println("本月最后一天："+getMonthBegin(time));
		// System.out.println("本月最后一天："+getMonthEnd(time));
		//
		// System.out.println("格式化日期："+parseDate("2017-05-08 14:53:33"));
		System.out.println("格式化日期：" + parseDate("2017/05/08 14:53", "yyyy/MM/dd HH:mm:ss"));

		System.out.println("本天起始时间：" + getDayBegin(time));
		System.out.println("本天起始时间：" + getDayEnd(time));

		// System.out.println(formatDate(d).toString());
		// System.out.println(getMonthBegin(formatDate(d).toString()));
		// System.out.println(getMonthBegin("2008/07/19"));
		// System.out.println(getMonthEnd("2008/07/19"));
		System.out.println(format(addDate(time, 24)));
		System.out.println(format(addDate(time, -8)));
	}



	public static String getDetailTimeOrderId(long time) {

		return new SimpleDateFormat("yyMMddHHmmss").format(time);
	}

	/**获取期望日期 从当前日期算**/
	public static String getExpectDate(int addYear, int monthAdd, int dayAdd,String partener) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.YEAR,addYear);
		cal.add(Calendar.MONTH, monthAdd);
		cal.add(Calendar.DAY_OF_MONTH, dayAdd);
		Date date = cal.getTime();
		return new SimpleDateFormat(partener).format(date);
	}

	/**获取期望日期 从当前日期算**/
	public static String getExpectDate(String dateStr,int addYear, int monthAdd, int dayAdd,String partener) {
		Calendar cal = Calendar.getInstance();
		cal.set(Integer.parseInt(dateStr.substring(0,4)),Integer.parseInt(dateStr.substring(4,6))-1,Integer.parseInt(dateStr.substring(6,8)));
		cal.add(Calendar.YEAR,addYear);
		cal.add(Calendar.MONTH, monthAdd);
		cal.add(Calendar.DAY_OF_MONTH, dayAdd);
		Date date = cal.getTime();
		return new SimpleDateFormat(partener).format(date);
	}

}
